﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;

namespace Source2HTML
{
    /// <summary>
    /// Класс, содержащий методы для подготовки файловой структуры
    /// для последующей конвертации
    /// </summary>
    public static class Utils
    {
        /// <summary>
        /// Создать файловую структуру для последующей конвертации
        /// </summary>
        /// <param name="outputDir">Выходная папка</param>
        /// <param name="patternInclude">Строка поиска файлов, которые должны быть включены</param>
        /// <param name="patternExclude">Строка поиска для исключения файлов из набора</param>
        /// <param name="recursive">Поиск в подкаталогах</param>
        /// <param name="cssPath">Путь к css-файлу</param>
        /// <returns>Набор элементов DictionaryEntry, где Key - путь к исходному файлу, Value - путь к выходному файлу
        /// </returns>
        public static List<DictionaryEntry> CreateFileStruct(string outputDir, string patternInclude, string patternExclude, bool recursive, string cssPath)
        {
            int lastIndex = patternInclude.LastIndexOf('\\');
            string dir = "";            
            if (lastIndex == -1)
            {
                dir = Directory.GetCurrentDirectory();
            }
            else
            {
                dir = patternInclude.Substring(0, lastIndex);
            }
            string filePattern = patternInclude.Substring(lastIndex + 1);

            string[] files;
            if (recursive) 
                files = GetFileHierarchy(dir, filePattern);
                
            else
                files = Directory.GetFiles(dir, filePattern, SearchOption.TopDirectoryOnly);
            List<string> listFiles = new List<string>(files);

            
            string[] filesExclude;
            if (patternExclude != null)
            {
                
                if (recursive)
                    filesExclude = Directory.GetFiles(dir, patternExclude, SearchOption.AllDirectories);
                else
                    filesExclude = Directory.GetFiles(dir, patternExclude, SearchOption.TopDirectoryOnly);

                foreach (string fileForExclude in filesExclude)
                {
                    listFiles.Remove(fileForExclude);
                }
            }
            List<DictionaryEntry> result = new List<DictionaryEntry>();
            foreach (string pathForCreate in listFiles)
            {
                string path = Path.GetDirectoryName(pathForCreate);
                path = path.Replace(dir, outputDir);                
                Directory.CreateDirectory(path);
                if (cssPath != null) 
                    File.Copy(cssPath, path + @"\style.css", true);
                result.Add(new DictionaryEntry(pathForCreate, pathForCreate.Replace(dir,outputDir) + ".html"));                  

            }
            return result;
        }

        /// <summary>
        /// Метод, позволяющий получить отсортированный по степени вложенности список файлов
        /// </summary>
        /// <param name="folder">Исходная папка, в которой проводится поиск</param>
        /// <param name="pattern">Строка поиска для файлов</param>
        /// <returns>Набор отсортированных файлов</returns>
        static string[] GetFileHierarchy(string folder, string pattern)
        {
            List<string> toReturn = new List<string>();
            toReturn.AddRange(Directory.GetFiles(folder, pattern));
            string[] dirs = Directory.GetDirectories(folder);
            foreach (string dir in dirs) {
                toReturn.AddRange(GetFileHierarchy(dir,pattern));
            }
            return toReturn.ToArray();
        }
    }
}
